home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPMUL.SA < prev    next >
Text File  |  1989-08-30  |  6KB  |  125 lines

  1.          TTL       FAST FLOATING POINT MULTIPLY (FFPMUL)
  2. *******************************************
  3. * (C)  COPYRIGHT 1980 BY MOTOROLA INC.    *
  4. *******************************************
  5.  
  6. ********************************************
  7. *          FFPMUL  SUBROUTINE              *
  8. *                                          *
  9. * INPUT:                                   *
  10. *          D6 - FLOATING POINT MULTIPLIER  *
  11. *          D7 - FLOATING POINT MULTIPLICAN *
  12. *                                          *
  13. * OUTPUT:                                  *
  14. *          D7 - FLOATING POINT RESULT      *
  15. *                                          *
  16. *                                          *
  17. * CONDITION CODES:                         *
  18. *          N - SET IF RESULT NEGATIVE      *
  19. *          Z - SET IF RESULT IS ZERO       *
  20. *          V - SET IF OVERFLOW OCCURRED    *
  21. *          C - UNDEFINED                   *
  22. *          X - UNDEFINED                   *
  23. *                                          *
  24. * REGISTERS D3 THRU D5 ARE VOLATILE        *
  25. *                                          *
  26. * SIZE: 122 BYTES    STACK WORK: 0 BYTES   *
  27. *                                          *
  28. * NOTES:                                   *
  29. *   1) MULTIPIER UNALTERED (D6).           *
  30. *   2) UNDERFLOWS RETURN ZERO WITH NO      *
  31. *      INDICATOR SET.                      *
  32. *   3) OVERFLOWS WILL RETURN THE MAXIMUM   *
  33. *      VALUE WITH THE PROPER SIGN AND THE  *
  34. *      'V' BIT SET IN THE CCR.             *
  35. *   4) THIS VERSION OF THE MULTIPLY HAS A  *
  36. *      SLIGHT ERROR DUE TO TRUNCATION      *
  37. *      OF .00390625 IN THE LEAST SIGNIFIC- *
  38. *      ANT BIT.  THIS AMOUNTS TO AN AVERAGE*
  39. *      OF 1 INCORRECT LEAST  SIGNIFICANT   *
  40. *      BIT RESULT FOR EVERY 512 MULTIPLIES.*
  41. *                                          *
  42. *  TIMES: (8MHZ NO WAIT STATES ASSUMED)    *
  43. * ARG1 ZERO            5.750 MICROSECONDS  *
  44. * ARG2 ZERO            3.750 MICROSECONDS  *
  45. * MINIMUM TIME OTHERS 38.000 MICROSECONDS  *
  46. * MAXIMUM TIME OTHERS 51.750 MICROSECONDS  *
  47. * AVERAGE OTHERS      44.125 MICROSECONDS  *
  48. *                                          *
  49. ********************************************
  50.        PAGE
  51. FFPMUL IDNT  1,1  FFP MULTIPLY
  52.  
  53.        XDEF   FFPMUL     ENTRY POINT
  54.          XREF  FFPCPYRT   COPYRIGHT NOTICE
  55.  
  56.        SECTION   9
  57.  
  58. * FFPMUL SUBROUTINE ENTRY POINT
  59. FFPMUL MOVE.B D7,D5     PREPARE SIGN/EXPONENT WORK       4
  60.        BEQ.S  FFMRTN    RETURN IF RESULT ALREADY ZERO    8/10
  61.        MOVE.B D6,D4     COPY ARG1 SIGN/EXPONENT          4
  62.        BEQ.S  FFMRT0    RETURN ZERO IF ARG1=0            8/10
  63.        ADD.W  D5,D5     SHIFT LEFT BY ONE                4
  64.        ADD.W  D4,D4     SHIFT LEFT BY ONE                4
  65.        MOVEQ  #-128,D3  PREPARE EXPONENT MODIFIER ($80)  4
  66.        EOR.B  D3,D4     ADJUST ARG1 EXPONENT TO BINARY   4
  67.        EOR.B  D3,D5     ADJUST ARG2 EXPONENT TO BINARY   4
  68.        ADD.B  D4,D5     ADD EXPONENTS                    4
  69.        BVS.S  FFMOUF    BRANCH IF OVERFLOW/UNDERFLOW     8/10
  70.        MOVE.B D3,D4     OVERLAY $80 CONSTANT INTO D4     4
  71.        EOR.W  D4,D5     D5 NOW HAS SIGN AND EXPONENT     4
  72.        ROR.W  #1,D5     MOVE TO LOW 8 BITS               8
  73.        CLR.B  D7        CLEAR S+EXP OUT OF ARG2          4
  74.        MOVE.L D7,D3     PREPARE ARG2 FOR MULTIPLY        4
  75.        SWAP.W D3        USE TOP TWO SIGNIFICANT BYTES    4
  76.        MOVE.L D6,D4     COPY ARG1                        4
  77.        CLR.B  D4        CLEAR LOW BYTE (S+EXP)           4
  78.        MULU.W D4,D3     A3 X B1B2                        38-54 (46)
  79.        SWAP.W D4        TO ARG1 HIGH TWO BYTES           4
  80.        MULU.W D7,D4     B3 X A1A2                        38-54 (46)
  81.        ADD.L  D3,D4     ADD PARTIAL PRODUCTS R3R4R5      8
  82.        CLR.W  D4        CLEAR LOW END RUNOFF             4
  83.        ADDX.B D4,D4     SHIFT IN CARRY IF ANY            4
  84.        SWAP.W D4        PUT CARRY INTO HIGH WORD         4
  85.        SWAP.W D7        NOW TOP OF ARG2                  4
  86.        SWAP.W D6        AND TOP OF ARG1                  4
  87.        MULU.W D6,D7     A1A2 X B1B2                      40-70 (54)
  88.        SWAP.W D6        RESTORE ARG1                     4 
  89.        ADD.L  D4,D7     ADD PARTIAL PRODUCTS             8
  90.        BPL.S  FFMNOR    BRANCH IF MUST NORMALIZE         8/10
  91. FFMCON ADD.L  #$80,D7   ROUND UP (CANNOT OVERFLOW)       16
  92.        MOVE.B D5,D7     INSERT SIGN AND EXPONENT         4
  93.        BEQ.S  FFMRT0    RETURN ZERO IF ZERO EXPONENT     8/10
  94. FFMRTN RTS              RETURN TO CALLER                 16
  95.  
  96. * MUST NORMALIZE RESULT
  97. FFMNOR SUB.B   #1,D5    BUMP EXPONENT DOWN BY ONE        4
  98.        BVS.S   FFMRT0   RETURN ZERO IF UNDERFLOW         8/10
  99.        BCS.S   FFMRT0   RETURN ZERO IF SIGN INVERTED     8/10
  100.        MOVEQ   #$40,D4  ROUNDING FACTOR                  4
  101.        ADD.L   D4,D7    ADD IN ROUNDING FACTOR           8
  102.        ADD.L   D7,D7    SHIFT TO NORMALIZE               8
  103.        BCC.S   FFMCLN   RETURN NORMALIZED NUMBER         8/10
  104.        ROXR.L  #1,D7    ROUNDING FORCED CARRY IN TOP BIT 10
  105.        ADD.B   #1,D5    UNDO NORMALIZE ATTEMPT           4
  106. FFMCLN MOVE.B  D5,D7    INSERT SIGN AND EXPONENT         4
  107.        BEQ.S   FFMRT0   RETURN ZERO IF EXPONENT ZERO     8/10
  108.        RTS              RETURN TO CALLER                 16
  109.  
  110. * ARG1 ZERO
  111. FFMRT0 MOVE.L #0,D7     RETURN ZERO                      4
  112.        RTS              RETURN TO CALLER                 16
  113.  
  114. * OVERFLOW OR UNDERFLOW EXPONENT
  115. FFMOUF BPL.S  FFMRT0    BRANCH IF UNDERFLOW TO GIVE ZERO 8/10
  116.        EOR.B  D6,D7     CALCULATE PROPER SIGN            4
  117.        OR.L   #$FFFFFF7F,D7 FORCE HIGHEST VALUE POSSIBLE 16
  118.        TST.B  D7        SET SIGN IN RETURN CODE
  119. *        ORI.B   #$02,CCR                            SET OVERFLOW BIT
  120.        DC.L   $003C0002 ****SICK ASSEMBLER****           20
  121.        RTS              RETURN TO CALLER                 16
  122.  
  123.        END
  124.  
  125.